package genetica.cromosomas.evaluadores;

import genetica.cromosomas.fenotipos.Fenotipo;
import genetica.cromosomas.fenotipos.FenotipoViajante;
import genetica.data.viajante.Distancias;
import genetica.data.viajante.Ruta1;
import genetica.data.viajante.RutasInvalidas;

import java.util.ArrayList;

public class EvaluadorViajante extends Evaluador {
	public static RutasInvalidas rutas = new Ruta1();
	@Override
	public Double evalua(ArrayList<Fenotipo> fenotipo) {
		if (fenotipo.size() > 1)
			return Double.MAX_VALUE;

		int distancia = 0;
		FenotipoViajante ciudadesDestino = (FenotipoViajante) fenotipo.get(0);
		// PENALIZACIONES!!!
		Integer ciudadOrigen = ciudadesDestino.getCiudades().get(0);
		int primera = ciudadOrigen;
		int tam = ciudadesDestino.getCiudades().size();
		int ultima = ciudadesDestino.getCiudades().get(ciudadesDestino.getCiudades().size()-1);
		for (int i = 0; i < tam; i++) {
			int ciudadDestino = ciudadesDestino.getCiudades().get((i+1)%tam);
			int temp =	Distancias.getDist(ciudadOrigen, ciudadDestino);
			if (!rutas.destinoValido((i+1)%tam, ciudadDestino)){
				temp *=3;
			}
			 
			distancia += temp;
			ciudadOrigen = ciudadDestino;
		}
		return (distancia + Distancias.getDist(primera,ultima))* 1.0;
	}

}
